/*
 * Checker.h
 * Instance této třídy kontroluje meze genů algoritmu na základě parametrů
 * předaných v konstruktoru.
 *
 *  Created on: 4.1.2013
 *      Author: Lukas Gemela
 */

#ifndef CHECKER_H_
#define CHECKER_H_
#include "INPUT_PARAMS.h"
#include "IFastDataApprox.h"

class Checker {
private:
	INPUT_PARAMS const params;

public:
	/**
	 * zkontroluje meze genu na základě jeho indexu.
	 */
	bool checkRange(int index, double value) const {
		switch (index) {
		case PI:
			return checkRangeP(value);
			break;
		case CGI:
			return checkRangeCG(value);
			break;
		case CI:
			return checkRangeC(value);
			break;
		case DTI:
			return checkRangeDT(value);
			break;
		case KI:
			return checkRangeK(value);
			break;
		default:
			return false;
			break;
		}
	}

	/**
	 * zkontroluje meze p, vrací true pokud je gen v mezích.
	 */
	bool checkRangeP(double p) const {
		if (params.isPset) {
			return p == params.p;
		}
		return p > PARAM_P_DEFAULT_MIN && p < PARAM_P_DEFAULT_MAX;

	}
	/**
	 * zkontroluje meze cg, vrací true pokud je gen v mezích.
	 */
	bool checkRangeCG(double cg) const {
		return cg < 0;
	}

	/**
	 * zkontroluje meze dt, vrací true pokud je gen v mezích.
	 */
	bool checkRangeDT(double dt) const {
		return dt > params.dtMin && dt < params.dtMax;
	}

	/**
	 * zkontroluje meze c, vrací true pokud je gen v mezích.
	 */
	bool checkRangeC(double c) const {
		if (params.isCset) {
			return c == params.c;
		}
		return c > 0;
	}

	/**
	 * zkontroluje meze k, vrací true pokud je gen v mezích.
	 */
	bool checkRangeK(double k) const {
		if (params.isKset) {
			return k > params.kMin && k < params.kMax;
		}
		return true;
	}

	Checker(INPUT_PARAMS params) : params(params) {
	}

	/**
	 * zkontroluje meze + * dt + ecg, vrací true pokud je gen v mezích.
	 */
	bool checkTimeJumpRange(double k, double dt, double ecg) const {
		double jmp = k * dt * ecg;

		return jmp <= 5 * OneMinute && jmp >= -5 * OneMinute;
	}


};
#endif /* CHECKER_H_ */
